<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>原型链题目</title>
</head>

<body>
    <img src="./person.png" alt="原型链">
    <script>
        // T1
        var F = function() {};

        Object.prototype.a = function() {
            console.log("a");
        };

        Function.prototype.b = function() {
            console.log("b");
        };

        var f = new F();

        f.a(); //a 实例化对象里没有a 往下找 找到顶级对象Object有 Object.prototype.a = function() {console.log("a");}; 故打印a
        f.b(); // 报错 x 上一个同理 不过顶级对象Object没有 则undefined 即报错
        F.a(); // a 本身没有 找到顶级对象Object有 Object.prototype.a = function() {console.log("a");}; 故得到a
        F.b(); //b  F是函数有顶级函数Function 故找到   Function.prototype.b = function() {console.log("b");}; 故得到b


        // -----------
        // // T2
        var A = function() {};
        A.prototype.n = 1;
        var b = new A();
        A.prototype = {
            n: 2,
            m: 3,
        };
        var c = new A();

        console.log(b.n); // 1 实例化对象里有n  A.prototype.n = 1; 故得到1
        console.log(b.m); // undefined  实例化对象里没有m 往下找 找到顶级对象Object也没有m 即undefined

        console.log(c.n); // 2 实例化对象里有n 故得到2
        console.log(c.m); // 3 实例化对象里有m 故得到3
        // --------
        // // T3
        var foo = {},
            F = function() {};
        Object.prototype.a = "value a";
        Function.prototype.b = "value b";

        console.log(foo.a); // value a 本身没有 往下找 找到顶级对象Object有 Object.prototype.a = "value a"; 故打印value a
        console.log(foo.b); // undefined  本身没有 往下找 找到顶级对象Object也没有 故undefined

        console.log(F.a); // value a  本身没有 找到顶级对象Object有Object.prototype.a = "value a"; 故得到value a
        console.log(F.b); // value b  F是函数有顶级函数Function 故找到   Function.prototype.b = "value b"; 故得到value b
        // -----------
        // // T4
        function A() {}

        function B(a) {
            this.a = a;
        }

        function C(a) {
            if (a) {
                this.a = a;
            }
        }
        A.prototype.a = 1;
        B.prototype.a = 1;
        C.prototype.a = 1;

        console.log(new A().a); // 1 本身没有 实例化对象里有a   A.prototype.a = 1; 故打印1
        console.log(new B().a); // undefined  自身没赋值 故undefined
        console.log(new C(2).a); // 2 自身赋值2 故打印2
    </script>
</body>

</html>